#include <errno.h>    // 错误码处理
#include <fcntl.h>    // 文件控制标志
#include <sys/mman.h> // 共享内存操作
#include <time.h>     // 时间函数
#include <unistd.h>   // 系统调用
#include <iostream>
#include <filesystem>
#include <string.h>
#include <wayland-client.h>            // Wayland 客户端协议
#include "xdg-shell-client-protocol.h" // XDG Shell 协议
static void randname(char *buf)
{
    // 返回一个随机的名字
    struct timespec ts;
    clock_gettime(CLOCK_REALTIME, &ts);
    long r = ts.tv_nsec;
    for (int i = 0; i < 6; ++i)
    {
        buf[i] = 'A' + (r & 15) + (r & 16) * 2;
        r >>= 5;
    }
}
 //在系统的虚拟文件系统（通常是 /dev/shm）中创建或打开一个命名共享内存对象。该对象表现为一个特殊的文件，但实际数据存储在内存中而非磁盘。在系统的虚拟文件系统（通常是 /dev/shm）中创建或打开一个命名共享内存对象。该对象表现为一个特殊的文件，但实际数据存储在内存中而非磁盘。
static int create_shm_file(void)
{
    int retries = 100;
    do
    {
        char name[] = "/wl_shm-XXXXXX";
        randname(name + sizeof(name) - 7);
        --retries;
        /*
        name 参数：指定共享内存的唯一标识（如 /my_shared_mem），其他进程通过此名称访问同一内存区域。
        oflag 参数：控制操作行为，常用组合：
        O_CREAT | O_RDWR：不存在时创建，并以读写模式打开。
        O_RDONLY：以只读模式打开（适用于只读进程）。
        O_EXCL：与 O_CREAT 联用，确保独占创建（若已存在则失败）。
        mode 参数：设置权限（如 0600），仅在创建时生效。
        */
        int fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, 0600);
        if (fd >= 0)
        {
            shm_unlink(name);
            return fd;
        }
    } while (retries > 0 && errno == EEXIST);
    return -1;
}

static int allocate_shm_file(size_t size)
{

    int fd = create_shm_file();
    if (fd < 0)
        return -1;
    int ret;
    do
    {
        /*
         * 关于 ftruncate 的内容可以参考
         * https://www.man7.org/linux/man-pages/man3/ftruncate.3p.html
         */
        //调用 ftruncate() 设置共享内存大小。
        ret = ftruncate(fd, size);
    } while (ret < 0 && errno == EINTR);
    if (ret < 0)
    {
        close(fd);
        return -1;
    }
    return fd;
}

static bool ifFileExist(const char *path)
{
    return access(path, F_OK) == 0;
}

static void printFlie(const std::string &path)
{
    for (const auto &entry : std::filesystem::directory_iterator(path))
    {
        std::cout << entry.path().filename() << "\n";
    }
}
